# Create your views here.

import json

# 导入HttpResponse
from django.http import HttpResponse,JsonResponse
from django.views import View
from django.shortcuts import render
from .models import Projects
from django.db import connection


def index_page(request):
    """
    视图函数
    1、request第一个参数为HttpRequest对象或者HttpRequest子类的对象,存放的是所有的请求信息,无需手动传递
    2、一般会使用request(request是封装的类，可以接收所有前端传进的参数)
    3、一定要返回HttpRequest对象或者HttpResponse之类对象
    :param request:
    :return:
    """
    if request.method == 'GET':
        return HttpResponse('<h2>GET请求：欢迎我的网站</h2>')
    elif request.method == 'POST':
        return HttpResponse('<h2>POST请求：欢迎我的网站</h2>')
    elif request.method == 'PUT':
        return HttpResponse('<h2>PUT请求：欢迎我的网站</h2>')


def index_page2(request):
    return HttpResponse('<h2>Hello，欢迎我的网站</h2>')


class IndexPage(View):
    """
    类视图
    1、一定要继承View父类，或者View的之类
    2、可以定义get post put delete方法，来实现GET请求、POST请求等
    3、get、post、put、delete、delete方法名称固定，且均为小写
    4、实例方法的第二个参数为HttpRequest参数
    5.
    """
    def get(self,request):
        # 假设data数据是从数据库中读取的
        data = [
            {
                "paroject_name":"前程贷",
                "leader":"可优",
                "app_name":"p2p平台应用"
            },
            {
                "paroject_name": "探索火星项目",
                "leader": "悠悠",
                "app_name": "平台应用"
            },
            {
                "paroject_name": "无比牛逼的项目",
                "leader": "可可",
                "app_name": "神秘应用"
            },
        ]
        #这种是前后端不分离，通过渲染模板的方式实现
        # a. render函数主要用于渲染模板生成一个HTML页面，Django的模板引擎，会自动将模板语法编译解析成浏览器能识别的语言(HTML)
        # b. 第一个个参数为request
        # c. 第二个参数为templates目录下的目录名
        # d. 第三个参数为context，只能传字典
        # e. locals()函数获取当前命名空间中的所有变量信息
        # return render(request, 'demo.html')
        # return render(request,'index.html',locals())

        #前后端分离
        # a.JsonResponse是HttpResponse的之类
        # b.第一个参数为字典或者嵌套字典的列表，如果为非字典类型，则需要将safe设置为False
        # c.会返回一个json的字符串
        return JsonResponse(data,safe=False)

    def post(self,request):
        # 一、 创建(C)
        # 1.使用模型类对象来创建数据
        #   a.会创建一个Projects模型类对象，但是还未提交
        # project_obj = Projects(name='xxx项目3',leader='xxx项目负责人3',
        #                         tester='xx测试3',programmer='xxx研发3')
        # #  b. 需要调用模型对象的save()方法，去提交
        # project_obj.save()

        # 2.可以使用查询集的create方法创建数据
        #    使用模型类.objects.create()方法，无需调用save方法
        #    objects是manager对象，用于对数据进行操作
        # project_obj = Projects.objects.create(name='xxx项目4',leader='xxx项目负责人4',
        #                         tester='xx测试4',programmer='xxx研发4')

        # 二、更新(U)
        # 1,.先获取模型类对象，然后修改某些字段，再调用save方法保存
        # project_obj = Projects.objects.get(idx=3)
        # project_obj.name ='某某知名项目'
        # project_obj.save()

        # 2. 可以使用模型类名.objects.filer().update()
        # project_obj = Projects.objects.filter(idx=2).update(name='某某优秀的项目')

        # 三、删除(D)
        # 1.使用模型对象.delete()
        # one =(1,{'projects.Projects:1'}) 返回的是一个元组，第一个参数是删除的条数，里面的嵌套字典，key值为子应用名.模型类名
        # project_obj = Projects.objects.get(idx=3)
        # one = project_obj.delete()

        # 2. 可以使用模型类名.objects.filer().delete()
        # project_obj = Projects.objects.filter(idx=3).delete()


        # 四、查询(C)
        # 使用objects管理器来查询
        # 1.get方法，获取一条记录
        # a.一般只能用主键或者唯一键作为查询条件
        # b.get方法如果查询的记录为空或者多条记录，那么会抛出异常
        # c.返回的模型类对象，会自动提交
        # project_obj = Projects.objects.get(idx=1)

        # 2.all()方法，获取所有记录
        #   a.返回QuerySet查询集对象
        #   b.查询集对象类似于列表，支持列表中的某些操作，
        #   c.索引取值(负索引不支持,返回模型类对象，一条记录)、切片(返回QuerySet查询集对象)、支持for循环迭代，每次迭代，去除一个模型类对象
        #   d.QuerySet查询集对象.first()获取第一条记录、last()方法获取最后一条记录、count()方法，获取查询集中数据总条数
        #   e.支持惰性查询，只有你真正去使用数据时，才会去数据库中执行sql语句，为了性能
        #   f.支持链式调用
        # qs = Projects.objects.all()

        # 3.filter()方法，获取特定条件的数据
        #   a.filter支持多个过滤表达式，字段名_过滤表达式
        #   b.字段名__startswith、字段名__istartswith: 过滤以xxx开头的字符串，后者且忽略大小写
        #   c.字段名__endswith、字段名__iendswith: 过滤以xxx结尾的字符串
        #   d.字段名__gt: 大于，__gte: >= ,__le: < ,__Ite: <=
        #   e.SQL语句中字段名=条件与此处字段名__exact等价，在Django ORM中有一个内置的变量pk,为数据库模型类的主键别名
        #   f.__contains、__icontains、__in、__isnull
        #   g.如果查询出来的结果为空，会返回空查询集
        # Projects.objects.filter()

        # 4、exclude与filter是反向关系，
        # 与filter里面所有的操作一致，只不过返回的查询集是不包含指定条件的数据
        # Projects.objects.exclude()

        # 5.关联查询
        # 6.逻辑关系查询
        # 7.特殊查询
        return HttpResponse(f'<h2>POST请求：欢迎的网站</h2>')

    def put(self,request,pk):
        # a.HttpResponse对象，第一个参数为字符串类型或者字节类型，会将字符串内容返回前端
        # b. 可以使用content_type来指定响应体的内容类型
        # c. 可以使用status参数来指定响应状态码
        # return HttpResponse('<h2>PUT请求：欢迎我的网站</h2>')
        one_dict ='{"name":"keyou","age":18}'
        return HttpResponse(one_dict,content_type='application/json',status=201)

    def delete(self,request,pk):
        return HttpResponse('<h2>delete请求：欢迎我的网站</h2>')



